package UI;
import Commons.Logging.Log;
import Commons.Logging.Logger;
import Commons.TaskDescriptor;
import Commons.Workflow;
import java.net.UnknownHostException;



/**Questa classe descrive l'User Interface.
 *
 * @author Team5
 */
public class UI {

    /**Costruttore di default dell'UI.
     * Crea un istanza del Workflow e N td, che aggiunge al workflow. Dunque crea un istanza di WFQProxyFactory e chiama su quest'ogetto il metodo getProxy, che restituisce il Proxy per effettuare l'enqueue del WorkFlow.
     * STEP2: Creo un istanza dell'oggetto Logger che utilizzero' per loggare le operazioni svolte.
     * @throws UnknownHostException
     */
    private String id;

    public UI() throws UnknownHostException, Exception {
        id=this.getClass().getSimpleName()+String.valueOf(System.currentTimeMillis());
        Logger l=new Logger("log"+this.id+".xml",this.getClass().getSimpleName());
        l.logging(new Log(this.getClass().getSimpleName(),id, "StartUI",String.valueOf(System.currentTimeMillis()) ));
        Workflow wf = new Workflow();
        l.logging(new Log(this.getClass().getSimpleName(),id, "Creato WorkFlow: "+wf.toString(),String.valueOf(System.currentTimeMillis()) ));
        System.out.println("UI(): creato Workflow -> ID: "+wf.getID());
        int N=4;//modificare per variare il numero di taskDescriptor da creare
        for(int i=0;i<N;i++){
            TaskDescriptor td=new TaskDescriptor();
            l.logging(new Log(this.getClass().getSimpleName(),id, "Creato TaskDescriptor: "+td.toString(),String.valueOf(System.currentTimeMillis()) ));
            System.out.println("UI(): creato "+(i+1)+"° TaskDescriptor -> ID: "+td.getID());
            wf.addTask(td);
            l.logging(new Log(this.getClass().getSimpleName(),id, "Aggiunto "+td.toString()+" al WorkFlow "+wf.toString(),String.valueOf(System.currentTimeMillis()) ));
            System.out.println("UI(): "+(i+1)+"° td (ID: "+td.getID()+") aggiunto al WF "+wf.getID());
        }
        /*
        TaskDescriptor td=new TaskDescriptor();
        l.logging(new Log(this.getClass().getSimpleName(),id, "Creato TaskDescriptor: "+td.toString(),String.valueOf(System.currentTimeMillis()) ));
        td.setLink("FileCommand");
        l.logging(new Log(this.getClass().getSimpleName(),id, "Aggiunto file al "+td.toString(),String.valueOf(System.currentTimeMillis()) ));
        td.setCommand("cat FileCommand");
        System.out.println("UI(): creato "+4+"° TaskDescriptor (con FILE)-> ID: "+td.getID());
        wf.addTask(td);
        System.out.println("UI(): "+4+"° td (ID: "+td.getID()+") aggiunto al WF "+wf.getID());
        */
        for(int i=4;i<N+4;i++){
            TaskDescriptor td2=new TaskDescriptor();
            l.logging(new Log(this.getClass().getSimpleName(),id, "Creato TaskDescriptor: "+td2.toString(),String.valueOf(System.currentTimeMillis()) ));
            System.out.println("UI(): creato "+(i+1)+"° TaskDescriptor -> ID: "+td2.getID());
            wf.addTask(td2);
            l.logging(new Log(this.getClass().getSimpleName(),id, "Aggiunto "+td2.toString()+" al WorkFlow "+wf.toString(),String.valueOf(System.currentTimeMillis()) ));
            System.out.println("UI(): "+(i+1)+"° td (ID: "+td2.getID()+") aggiunto al WF "+wf.getID());
        }
        
        
        System.out.println("UI(): creo il WFQProxyFactory");
        WFQProxyFactory proxyfactory = new WFQProxyFactory();
        System.out.println("UI(): chiamo getProxy() sull'istanza del WFQProxyFactory");
        WFQueueManagerProxy queuemanproxy = proxyfactory.getProxy();
        System.out.println("UI(): chiamo l'enqueue(wf) sull'istanza  del WFQueueManagerProxy");
        wf.setVectorClock(l.getVectorClock());
        int val = queuemanproxy.enqueue(wf);
        l.logging(new Log(this.getClass().getSimpleName(),id, "Inviato WorkFlow"+wf.toString(),String.valueOf(System.currentTimeMillis())));
        System.out.println("UI(): ricevuto int: "+val);
        l.logging(new Log(this.getClass().getSimpleName(),id, "Ricevuto ack invio WorkFlow"+wf.toString()+" (aggiunto in posizione "+val+" in coda al WFQueueManager)",String.valueOf(System.currentTimeMillis())));
        //a questo punto la logica del programma continua nella funzione enqueue della classe WFQueueManagerProxy_UDP_PUSH
        l.chiudiFileLog();
    }
    /**Costruttore dell'UI con parametri.
     * Crea un istanza di WFQProxyFactory e chiama su quest'ogetto il metodo getProxy, che restituisce il Proxy per effettuare l'enqueue. DUnque fa l'enqueue su questo.
     * @throws UnknownHostException
     */
    public UI(Workflow wf) throws Exception {
        
        WFQProxyFactory proxyfactory = new WFQProxyFactory();
        WFQueueManagerProxy queuemanproxy = proxyfactory.getProxy();
        int val = queuemanproxy.enqueue(wf);

    }

    public String getid(){
        return this.id;
    }
    
     
     
     


}
